<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>基于 Java 的绿色出行倡导与数据记录系统</title>
    <style>
        body {
            font-family: 'SimSun', '宋体', serif;
            /* Default to Songti */
            font-size: 14pt;
            /* 小四号宋体 */
            line-height: 1;
            /* 单倍行距 */
            margin: 2.5cm;
        }

        .paper-title {
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 22pt;
            /* 3号 */
            font-weight: bold;
            text-align: center;
            margin-bottom: 30px;
        }

        h1 {
            /* 一级大标题 */
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 16pt;
            /* Approx 小三号, 加粗 */
            font-weight: bold;
            text-align: left;
            margin-top: 20px;
            margin-bottom: 15px;
        }

        h2 {
            /* 二级大标题 */
            font-family: 'SimHei', '黑体', sans-serif;
            /* 黑体 */
            font-size: 14pt;
            /* 小四号 */
            font-weight: normal;
            /* 不加粗 */
            text-align: left;
            margin-top: 15px;
            margin-bottom: 10px;
        }

        h3 {
            /* 三级标题 */
            font-family: 'SimSun', '宋体', serif;
            font-size: 14pt;
            /* 小四号 */
            font-weight: bold;
            /* Usually bold */
            text-align: left;
            margin-top: 10px;
            margin-bottom: 5px;
        }

        p,
        li {
            font-family: 'SimSun', '宋体', serif;
            font-size: 14pt;
            /* 小四号 */
            line-height: 1.0;
            /* 单倍行距 */
            margin: 10px 0;
            text-align: justify;
            text-indent: 2em;
            /* 首行缩进2字符 */
        }

        p.no-indent,
        div.no-indent p,
        li p,
        .toc-level-1,
        .toc-level-2 {
            text-indent: 0;
        }

        ul,
        ol {
            padding-left: 2em;
            /* Keep list indent */
            margin-left: 0;
            /* Override default margin */
            text-indent: 0;
        }

        li {
            margin-bottom: 5px;
            text-indent: 0;
        }

        /* Directory styles */
        .toc-title {
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 22pt;
            /* 三号 */
            font-weight: bold;
            text-align: center;
            margin-bottom: 20px;
        }

        .toc-level-1 {
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 14pt;
            /* 小四号 */
            font-weight: bold;
            margin-left: 0;
            line-height: 1.5;
            /* 1.5倍行距 */
        }

        .toc-level-2 {
            font-family: 'SimSun', '宋体', serif;
            font-size: 14pt;
            /* 小四号 */
            font-weight: normal;
            margin-left: 2em;
            /* Indent second level */
            line-height: 1.5;
            /* 1.5倍行距 */
        }

        .toc-page-number {
            float: right;
        }

        /* Reference styles */
        .references-title {
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 14pt;
            /* 小四号黑 */
            font-weight: bold;
            text-align: left;
            margin-top: 28pt;
            /* 段前空1行 (approx 2 * 14pt) */
            margin-bottom: 0;
            /* 段后空0行 */
        }

        .references-list p {
            font-family: 'SimSun', '宋体', serif;
            font-size: 10.5pt;
            /* 5号 */
            line-height: 1.0;
            /* 单倍行距 */
            text-indent: -2em;
            margin-left: 2em;
            margin-top: 5px;
            /* Adjust top margin slightly */
            margin-bottom: 5px;
        }

        .references-list p span.en {
            font-family: 'Times New Roman', serif;
        }

        /* Table styles */
        table {
            border-collapse: collapse;
            width: 100%;
            margin-top: 15px;
            margin-bottom: 15px;
            font-family: 'SimSun', '宋体', serif;
            font-size: 12pt;
        }

        th,
        td {
            border: 1px solid black;
            padding: 6px;
            text-align: left;
            font-size: 12pt;
            line-height: 1.2;
            vertical-align: top;
            text-indent: 0;
        }

        th {
            background-color: #f2f2f2;
            font-weight: bold;
            text-align: center;
        }

        /* Textual description of figures/tables */
        .figure-description,
        .table-description {
            font-style: italic;
            text-align: center;
            margin-top: 10px;
            margin-bottom: 10px;
            text-indent: 0;
            font-size: 12pt;
            /* Make descriptions slightly smaller */
        }

        /* Code/SQL/Mermaid description blocks */
        .code-block,
        pre code {
            font-family: 'Courier New', Courier, monospace;
            font-size: 11pt;
            /* Slightly smaller for code */
            background-color: #f5f5f5;
            border: 1px solid #ccc;
            padding: 10px;
            margin: 10px 0;
            white-space: pre-wrap;
            word-wrap: break-word;
            text-indent: 0;
            display: block;
            /* Ensure pre takes block display */
        }

        /* Style for appendix */
        .appendix h2 {
            margin-top: 30px;
            /* More space before appendix titles */
        }

        .appendix h3 {
            font-family: 'SimHei', '黑体', sans-serif;
            font-size: 14pt;
            /* 小四号 */
            font-weight: bold;
            /* Bold for sub-appendix */
            margin-top: 15px;
        }
    </style>
</head>

<body>

    <div class="paper-title">基于 Java 的绿色出行倡导与数据记录系统</div>

    <div class="toc-title">目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;录</div>
    <p class="toc-level-1">1. 概述<span class="toc-page-number">1</span></p>
    <p class="toc-level-2">1.1 项目背景<span class="toc-page-number">1</span></p>
    <p class="toc-level-2">1.2 编写目的<span class="toc-page-number">1</span></p>
    <p class="toc-level-2">1.3 软件定义<span class="toc-page-number">2</span></p>
    <p class="toc-level-2">1.4 开发环境<span class="toc-page-number">2</span></p>
    <p class="toc-level-1">2. 需求分析<span class="toc-page-number">3</span></p>
    <p class="toc-level-2">2.1 问题陈述<span class="toc-page-number">3</span></p>
    <p class="toc-level-2">2.2 功能需求<span class="toc-page-number">3</span></p>
    <p class="toc-level-2">2.3 数据流描述<span class="toc-page-number">5</span></p>
    <p class="toc-level-1">3. 概要设计<span class="toc-page-number">6</span></p>
    <p class="toc-level-2">3.1 实体属性描述<span class="toc-page-number">6</span></p>
    <p class="toc-level-2">3.2 全局E-R关系描述<span class="toc-page-number">7</span></p>
    <p class="toc-level-1">4. 详细设计<span class="toc-page-number">8</span></p>
    <p class="toc-level-2">4.1 数据库设计<span class="toc-page-number">8</span></p>
    <p class="toc-level-2">4.2 模块及窗体设计<span class="toc-page-number">11</span></p>
    <p class="toc-level-1">5. 软件界面设计<span class="toc-page-number">14</span></p>
    <p class="toc-level-2">5.1 界面设计原则<span class="toc-page-number">14</span></p>
    <p class="toc-level-2">5.2 关键界面描述<span class="toc-page-number">14</span></p>
    <p class="toc-level-1">6. 软件测试<span class="toc-page-number">17</span></p>
    <p class="toc-level-2">6.1 测试环境<span class="toc-page-number">17</span></p>
    <p class="toc-level-2">6.2 测试用例描述<span class="toc-page-number">17</span></p>
    <p class="toc-level-2">6.3 测试结果与分析<span class="toc-page-number">20</span></p>
    <p class="toc-level-1">7. 总结<span class="toc-page-number">21</span></p>
    <p class="toc-level-2">7.1 课程设计心得<span class="toc-page-number">21</span></p>
    <p class="toc-level-2">7.2 数据库理论与软件开发实践的关系<span class="toc-page-number">21</span></p>
    <p class="toc-level-2">7.3 项目收获<span class="toc-page-number">22</span></p>
    <p class="toc-level-2">7.4 系统改进方向<span class="toc-page-number">23</span></p>
    <p class="toc-level-1">参考文献<span class="toc-page-number">24</span></p>

    <!-- 正文内容开始 -->

    <h1>1. 概述</h1>

    <h2>1.1 项目背景</h2>
    <p>在全球气候变化日益严峻、城市环境问题备受关注的大背景下，倡导绿色低碳的生活方式已成为社会共识。其中，绿色出行作为降低交通领域碳排放、缓解城市拥堵、改善空气质量的重要途径，受到了广泛的提倡与鼓励。然而，仅仅依靠宏观倡导往往难以有效激发个体层面的持续行动。许多市民虽然认同绿色出行的理念，但在实际生活中，可能因为缺乏便捷的记录工具、直观的量化反馈以及持续的激励机制，导致绿色出行行为难以常态化、习惯化。因此，开发一个能够方便用户记录个人绿色出行数据、量化其环保贡献并提供一定社交互动与激励功能的系统，对于推动绿色出行理念的落地、培养公民环保意识具有积极的现实意义。
    </p>

    <h2>1.2 编写目的</h2>
    <p>本文档旨在详细、准确地记述"基于 Java
        的绿色出行倡导与数据记录系统"的设计与开发全过程。其主要目的在于：首先，清晰界定系统的各项功能需求，为后续的开发工作提供明确的目标指引；其次，系统性地阐述系统的整体架构、核心模块划分、数据库结构以及关键功能的实现逻辑与界面设计思路，作为开发团队内部沟通、协作和技术实现的依据；再次，为系统的后期测试、部署、维护以及可能的版本迭代提供必要的技术参考资料；最后，也作为本次课程设计的最终成果，展现项目的设计思想、实现方法和遇到的挑战与解决方案，总结开发过程中的经验与反思。
    </p>

    <h2>1.3 软件定义</h2>
    <p>本系统定义为一个基于 Java 语言、采用 Swing 图形用户界面（GUI）技术、并利用 JDBC
        进行数据库交互的桌面应用程序。其核心定位是作为一款面向个人用户的绿色出行数据记录与倡导工具。系统旨在为用户提供便捷的途径来录入个人的绿色出行活动（如乘坐公交、地铁、骑行共享单车、步行等），并根据预设规则自动计算相应的碳减排量和累积积分。同时，系统还包含展示本地绿色出行资讯、查看个人及好友环保成果、进行简单的社区动态分享与评论等辅助功能，以增强用户的使用兴趣和参与感。它并非一个提供实时导航或复杂路线规划的工具，而是侧重于出行后的数据记录、量化反馈和基础的社交激励。
    </p>

    <h2>1.4 开发环境</h2>
    <p>本"基于 Java 的绿色出行倡导与数据记录系统"项目在开发与测试阶段所依赖的核心技术栈与环境配置如下：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>操作系统：</strong>选用 Windows 11 作为主要的开发与测试平台。</p>
        </li>
        <li>
            <p class="no-indent"><strong>开发工具：</strong>采用 IntelliJ IDEA 作为集成开发环境（IDE），进行后端Java代码的编写与调试。</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据库：</strong>选用 MySQL 5.7 版本作为关系型数据库管理系统，负责存储系统的核心业务数据。</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据库连接：</strong>后端应用程序通过 JDBC (Java Database Connectivity) 技术与 MySQL
                数据库建立连接并进行数据交互。</p>
        </li>
    </ul>

    <h1>2. 需求分析</h1>

    <h2>2.1 问题陈述</h2>
    <p>尽管绿色出行理念日益普及，但在鼓励个体积极参与并持续实践方面仍面临挑战。主要问题在于缺乏一个集成化的工具，能够便捷地记录个人绿色出行活动、直观量化其环保贡献，并提供一定的激励和社交反馈。现有应用往往侧重于导航或票务，未能很好地满足用户对个人绿色行为管理的需求。因此，本系统旨在弥补这一空白，通过设计一个易于使用的记录与倡导平台，激发用户参与绿色出行的内在动力，并帮助其养成可持续的环保习惯。
    </p>

    <h2>2.2 功能需求</h2>
    <p>为了解决上述问题并达成项目目标，本系统规划实现以下核心功能：</p>
    <ol>
        <li>
            <p class="no-indent"><strong>用户信息管理</strong></p>
            <ul>
                <li>
                    <p class="no-indent">
                        <strong>用户注册：</strong>系统应提供一个图形化注册界面。用户需能输入姓名、联系方式、所在地区、登录用户名和密码。点击注册后，系统需对输入（特别是用户名唯一性）进行校验，并将合法的用户信息（密码需加密）存入数据库。
                    </p>
                </li>
                <li>
                    <p class="no-indent">
                        <strong>用户登录：</strong>系统应提供一个登录界面。用户需输入用户名和密码进行验证。系统将根据数据库记录核实凭证。验证成功则允许用户访问系统主功能；失败则应给出明确提示，并考虑设置有限次数的重试机制。
                    </p>
                </li>
                <li>
                    <p class="no-indent">
                        <strong>信息修改：</strong>登录后的用户应能够在其个人资料界面查看并修改允许修改的个人信息（如联系方式）。保存操作需将更新后的数据同步至数据库。
                    </p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>绿色出行信息展示</strong></p>
            <ul>
                <li>
                    <p class="no-indent">
                        <strong>线路信息参考：</strong>系统需能读取并展示预设的本地绿色出行线路信息（如主要公交/地铁站点及运营时间概览），以列表或表格形式呈现，供用户出行前参考。此功能不涉及实时路线规划。
                    </p>
                </li>
                <li>
                    <p class="no-indent">
                        <strong>共享交通工具点位参考：</strong>系统需能展示预设的共享单车/电动车的主要分布点位信息及象征性数量，以列表或文本形式呈现。此功能不集成实时地图或车辆状态。
                    </p>
                </li>
                <li>
                    <p class="no-indent"><strong>资讯浏览：</strong>系统应设立专门区域，用于展示从数据库或文件加载的预置绿色出行相关资讯、政策或知识，支持滚动或分页浏览。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>出行记录与积分系统</strong></p>
            <ul>
                <li>
                    <p class="no-indent">
                        <strong>出行记录录入：</strong>系统必须提供一个界面，允许用户手动录入已完成的绿色出行详情，包括时间、方式、起讫点描述和可选的距离。保存操作需将记录存入数据库，并与当前用户关联。
                    </p>
                </li>
                <li>
                    <p class="no-indent">
                        <strong>积分累计与查询：</strong>系统需根据用户保存的出行记录，依据预设在数据库中的规则（按距离或次数），自动计算并累加积分至用户账户。用户应能在界面上方便地查询到自己当前的积分总额。
                    </p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>碳减排计算与排行榜</strong></p>
            <ul>
                <li>
                    <p class="no-indent">
                        <strong>碳减排量化：</strong>伴随出行记录的保存，系统还应根据预设的碳减排因子，计算本次绿色出行相较于传统方式所减少的碳排放量，并将其累计到用户账户。用户应能在界面上看到单次及累计的减排数据。
                    </p>
                </li>
                <li>
                    <p class="no-indent"><strong>排行榜展示：</strong>系统需提供一个排行榜功能，查询数据库中所有用户的累计碳减排数据，并按降序在界面上展示排名、用户名和减排量。
                    </p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>基础数据分析功能</strong></p>
            <ul>
                <li>
                    <p class="no-indent">
                        <strong>出行数据统计：</strong>系统应能对用户（个人或全体，视设计而定）的出行记录进行简单的统计分析，如计算不同出行方式的使用频率、平均出行距离等，并将结果以表格或基础图表形式展示。
                    </p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>简易交互功能</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>好友动态查看（若实现）：</strong>如果设计了好友关系，用户应能查看其好友分享的绿色出行相关动态或环保成果。</p>
                </li>
                <li>
                    <p class="no-indent">
                        <strong>动态发布与评论：</strong>系统应允许用户发布简单的与绿色出行相关的文字动态，并能查看他人发布的动态。同时，需支持用户对动态进行文字评论。发布的内容和评论都需存储到数据库。
                    </p>
                </li>
            </ul>
        </li>
    </ol>

    <h2>2.3 数据流描述</h2>
    <p>基于上述功能需求，规划系统内关键信息处理的流程（替代数据流图 DFD）：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>用户登录流程规划：</strong> 用户在登录界面输入凭证 -> 点击登录 -> 界面将数据传递给认证逻辑 -> 认证逻辑查询数据库 `t_user`
                表进行比对 -> 若成功，加载用户信息，关闭登录窗口，打开主窗口 (`MainFrame`)；若失败，向用户显示错误提示。</p>
        </li>
        <li>
            <p class="no-indent"><strong>出行记录保存流程规划：</strong> 用户在录入界面填写信息 -> 点击保存 -> 界面获取并校验数据，封装为 `TravelRecord` 对象 ->
                调用数据访问逻辑 (`TravelRecordDAO`) -> DAO 内部计算积分和减排量（查询规则/因子表），然后将记录插入 `t_travel_record` 表，并在事务中更新 `t_user`
                表的累计积分和减排量 -> 操作成功后，返回成功状态给界面 -> 界面清空表单并给出成功反馈，同时触发相关数据显示的更新。</p>
        </li>
        <li>
            <p class="no-indent"><strong>排行榜展示流程规划：</strong> 用户访问排行榜界面 -> 界面触发数据加载 -> 调用用户数据访问对象 (`UserDAO`) 的查询方法 ->
                DAO 执行 SQL 查询（`SELECT ... ORDER BY total_carbon_reduction DESC`）-> 获取排序后的用户列表 -> 返回给界面 -> 界面将数据显示在表格
                (`JTable`) 或列表 (`JList`) 组件中。</p>
        </li>
    </ul>

    <h1>3. 概要设计</h1>

    <h2>3.1 实体属性描述</h2>
    <p>基于需求分析阶段明确的功能，本系统核心业务涉及的主要实体及其关键属性，通过文字描述如下：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>用户 (User) 实体：</strong>代表系统的注册用户，是所有活动的主体。</p>
            <ul>
                <li>
                    <p class="no-indent">`user_id` (用户ID): 整型，唯一标识，主键。</p>
                </li>
                <li>
                    <p class="no-indent">`username` (用户名): 字符串，用于登录，需唯一。</p>
                </li>
                <li>
                    <p class="no-indent">`password` (密码): 字符串，存储加密后的密码摘要。</p>
                </li>
                <li>
                    <p class="no-indent">`full_name` (姓名): 字符串，用户的真实姓名。</p>
                </li>
                <li>
                    <p class="no-indent">`contact_info` (联系方式): 字符串，如手机号或邮箱。</p>
                </li>
                <li>
                    <p class="no-indent">`region` (所在地区): 字符串，用户所在的城市或区域。</p>
                </li>
                <li>
                    <p class="no-indent">`register_time` (注册时间): 日期时间类型。</p>
                </li>
                <li>
                    <p class="no-indent">`total_points` (总积分): 整型，累计获得的积分。</p>
                </li>
                <li>
                    <p class="no-indent">`total_carbon_reduction` (累计碳减排量): 浮点型，单位kg。</p>
                </li>
                <li>
                    <p class="no-indent">`status` (账户状态): 整型或枚举，如正常、禁用。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>出行记录 (TravelRecord) 实体：</strong>代表用户录入的一次绿色出行活动。</p>
            <ul>
                <li>
                    <p class="no-indent">`record_id` (记录ID): 整型，唯一标识，主键。</p>
                </li>
                <li>
                    <p class="no-indent">`user_id` (用户ID): 整型，外键，关联到用户实体，表明记录归属。</p>
                </li>
                <li>
                    <p class="no-indent">`travel_time` (出行时间): 日期时间类型，记录出行发生的具体时间。</p>
                </li>
                <li>
                    <p class="no-indent">`travel_mode` (出行方式): 字符串或整型枚举，如 '公交', '地铁', '共享单车', '步行'。</p>
                </li>
                <li>
                    <p class="no-indent">`start_location` (起始地点): 字符串，用户输入的起点描述。</p>
                </li>
                <li>
                    <p class="no-indent">`end_location` (终点地点): 字符串，用户输入的终点描述。</p>
                </li>
                <li>
                    <p class="no-indent">`distance` (距离): 浮点型，可选，用户输入的出行距离（公里）。</p>
                </li>
                <li>
                    <p class="no-indent">`points_earned` (获得积分): 整型，本次出行计算获得的积分。</p>
                </li>
                <li>
                    <p class="no-indent">`carbon_reduction_calculated` (计算减排量): 浮点型，本次出行计算出的碳减排量（kg）。</p>
                </li>
                <li>
                    <p class="no-indent">`record_creation_time` (记录创建时间): 日期时间类型，记录这条数据是何时录入系统的。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>社区动态 (Post) 实体：</strong>代表用户在社区发布的文字动态。</p>
            <ul>
                <li>
                    <p class="no-indent">`post_id` (动态ID): 整型，唯一标识，主键。</p>
                </li>
                <li>
                    <p class="no-indent">`user_id` (用户ID): 整型，外键，关联到用户实体，表明发布者。</p>
                </li>
                <li>
                    <p class="no-indent">`content` (内容): 文本类型，存储用户发布的文字内容。</p>
                </li>
                <li>
                    <p class="no-indent">`publish_time` (发布时间): 日期时间类型。</p>
                </li>
                <li>
                    <p class="no-indent">`status` (动态状态): 整型或枚举，如正常、已删除、被屏蔽。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>评论 (Comment) 实体：</strong>代表针对某条社区动态的评论。</p>
            <ul>
                <li>
                    <p class="no-indent">`comment_id` (评论ID): 整型，唯一标识，主键。</p>
                </li>
                <li>
                    <p class="no-indent">`post_id` (动态ID): 整型，外键，关联到社区动态实体，表明评论对象。</p>
                </li>
                <li>
                    <p class="no-indent">`user_id` (用户ID): 整型，外键，关联到用户实体，表明评论者。</p>
                </li>
                <li>
                    <p class="no-indent">`comment_content` (评论内容): 文本类型。</p>
                </li>
                <li>
                    <p class="no-indent">`comment_time` (评论时间): 日期时间类型。</p>
                </li>
                <li>
                    <p class="no-indent">`status` (评论状态): 整型或枚举。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>好友关系 (Friendship) 实体（如果实现好友功能）：</strong>代表用户之间的关注或好友关系，通常用连接表实现。</p>
            <ul>
                <li>
                    <p class="no-indent">`friendship_id` (关系ID): 整型，唯一标识，主键。</p>
                </li>
                <li>
                    <p class="no-indent">`user_id_1` (用户1ID): 整型，外键，关联用户。</p>
                </li>
                <li>
                    <p class="no-indent">`user_id_2` (用户2ID): 整型，外键，关联用户。</p>
                </li>
                <li>
                    <p class="no-indent">`relationship_status` (关系状态): 整型或枚举，如 '好友', '关注', '待确认'。</p>
                </li>
                <li>
                    <p class="no-indent">`creation_time` (关系建立时间): 日期时间类型。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>（配置类实体，非核心业务但必要）</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>积分规则 (PointRule) 实体：</strong> 定义不同出行方式的积分规则。</p>
                    <ul>
                        <li>`rule_id`, `travel_mode`, `points_per_km`, `points_per_trip` 等属性。</li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent"><strong>碳排放因子 (CarbonFactor) 实体：</strong> 定义不同出行方式的碳减排计算因子。</p>
                    <ul>
                        <li>`factor_id`, `travel_mode`, `reduction_per_km`, `reduction_per_trip` 等属性。</li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent"><strong>资讯 (News) 实体：</strong> 存储展示给用户的资讯内容。</p>
                    <ul>
                        <li>`news_id`, `title`, `content`, `publish_date` 等属性。</li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent"><strong>线路信息 (RouteInfo) 实体：</strong> 存储预设的公交/地铁线路信息。</p>
                    <ul>
                        <li>`route_info_id`, `city`, `line_name`, `type` ('公交'/'地铁'), `stations`, `operating_time` 等属性。
                        </li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent"><strong>共享点位 (SharedPoint) 实体：</strong> 存储预设的共享单车/电单车点位信息。</p>
                    <ul>
                        <li>`point_id`, `city`, `location_name`, `type` ('单车'/'电单车'), `estimated_count` 等属性。</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>

    <h2>3.2 全局E-R关系描述</h2>
    <p>基于上述实体识别，我们可以通过文字描述来勾勒出它们之间的主要关系（替代全局E-R图）：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>用户 (User) 与 出行记录 (TravelRecord) 的关系：</strong>
                一个用户可以拥有多条出行记录，而每一条出行记录都只属于一个用户。这是一种典型的一对多 (1:N) 关系。在 `TravelRecord` 实体中，`user_id` 属性作为外键指向 `User` 实体的主键
                `user_id`。</p>
        </li>
        <li>
            <p class="no-indent"><strong>用户 (User) 与 社区动态 (Post) 的关系：</strong> 一个用户可以发布多条社区动态，而每一条动态都只由一个用户发布。这也是一种一对多
                (1:N) 关系。在 `Post` 实体中，`user_id` 作为外键关联到 `User` 实体。</p>
        </li>
        <li>
            <p class="no-indent"><strong>社区动态 (Post) 与 评论 (Comment) 的关系：</strong>
                一条社区动态可以被多条评论所评论，而每一条评论都只针对某一条特定的动态。这同样是一对多 (1:N) 关系。在 `Comment` 实体中，`post_id` 作为外键关联到 `Post` 实体。</p>
        </li>
        <li>
            <p class="no-indent"><strong>用户 (User) 与 评论 (Comment) 的关系：</strong> 一个用户可以发表多条评论，而每一条评论都只由一个用户发表。这也是一对多
                (1:N) 关系。在 `Comment` 实体中，`user_id` 作为外键关联到 `User` 实体。</p>
        </li>
        <li>
            <p class="no-indent"><strong>用户 (User) 与 好友关系 (Friendship) 的关系（如果实现）：</strong>
                用户之间可以建立好友或关注关系。一个用户可以有多个好友/关注者，也可以关注多个其他用户。这种关系是多对多 (M:N) 的。在数据库层面，这通常通过一个连接表（如
                `t_friendship`）来实现，该表包含两个外键，分别指向 `User` 表的 `user_id`，用于记录是哪两个用户之间建立了关系。</p>
        </li>
        <li>
            <p class="no-indent"><strong>（隐含关系）出行记录 (TravelRecord) 与 积分规则 (PointRule) / 碳排放因子 (CarbonFactor)
                    的关系：</strong> 在计算积分和减排量时，需要根据出行记录中的 `travel_mode` 查找对应的规则或因子。这是一种查找关系，数据库层面不一定需要显式外键，但在业务逻辑中存在关联。
            </p>
        </li>
        <li>
            <p class="no-indent"><strong>（隐含关系）用户 (User) 与 资讯 (News) / 线路信息 (RouteInfo) / 共享点位 (SharedPoint)
                    的关系：</strong> 用户可以查看这些信息，这是一种读取关系，数据库层面通常不存在直接的强关联（除非需要根据用户所在地区 `region` 筛选信息）。</p>
        </li>
    </ul>
    <p>这些实体及其关系共同构成了本系统的数据模型基础，指导着后续数据库表的设计。</p>

    <h1>4. 详细设计</h1>

    <h2>4.1 数据库设计</h2>
    <p>在概要设计阶段明确了核心实体及其关系后，本节将这些概念模型转化为具体的数据库关系表结构。数据库选用 MySQL 5.7，字符集采用 `utf8` 或 `utf8mb4` 以支持中文。以下是主要数据表的详细设计描述：</p>

    <h3>4.1.1 用户表 (t_user)</h3>
    <p><strong>描述：</strong> 存储系统用户的基本注册信息、累计数据和状态。</p>
    <div class="table-description">以下为 t_user 表的结构文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>user_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>用户唯一标识符</td>
            </tr>
            <tr>
                <td>username</td>
                <td>VARCHAR(50)</td>
                <td>非空 (NOT NULL), 唯一 (UNIQUE)</td>
                <td>用户登录名</td>
            </tr>
            <tr>
                <td>password</td>
                <td>VARCHAR(100)</td>
                <td>非空 (NOT NULL)</td>
                <td>存储加盐哈希后的密码</td>
            </tr>
            <tr>
                <td>full_name</td>
                <td>VARCHAR(50)</td>
                <td></td>
                <td>用户真实姓名</td>
            </tr>
            <tr>
                <td>contact_info</td>
                <td>VARCHAR(100)</td>
                <td></td>
                <td>联系方式（手机/邮箱）</td>
            </tr>
            <tr>
                <td>region</td>
                <td>VARCHAR(100)</td>
                <td></td>
                <td>用户所在地区</td>
            </tr>
            <tr>
                <td>register_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL), DEFAULT CURRENT_TIMESTAMP</td>
                <td>用户注册时间</td>
            </tr>
            <tr>
                <td>total_points</td>
                <td>INT</td>
                <td>非空 (NOT NULL), DEFAULT 0</td>
                <td>用户当前累计总积分</td>
            </tr>
            <tr>
                <td>total_carbon_reduction</td>
                <td>DECIMAL(10, 2)</td>
                <td>非空 (NOT NULL), DEFAULT 0.00</td>
                <td>用户累计碳减排量 (kg)</td>
            </tr>
            <tr>
                <td>status</td>
                <td>TINYINT</td>
                <td>非空 (NOT NULL), DEFAULT 1</td>
                <td>账户状态 (1:正常, 0:禁用)</td>
            </tr>
        </tbody>
    </table>

    <h3>4.1.2 出行记录表 (t_travel_record)</h3>
    <p><strong>描述：</strong> 存储用户手动录入的每一次绿色出行活动的详细信息。</p>
    <div class="table-description">以下为 t_travel_record 表的结构文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>record_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>出行记录唯一标识符</td>
            </tr>
            <tr>
                <td>user_id</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_user(user_id)</td>
                <td>关联的用户ID</td>
            </tr>
            <tr>
                <td>travel_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL)</td>
                <td>出行发生的日期和时间</td>
            </tr>
            <tr>
                <td>travel_mode</td>
                <td>VARCHAR(20)</td>
                <td>非空 (NOT NULL)</td>
                <td>出行方式 (如 '公交', '地铁', '共享单车', '步行')</td>
            </tr>
            <tr>
                <td>start_location</td>
                <td>VARCHAR(255)</td>
                <td></td>
                <td>用户输入的起始地点描述</td>
            </tr>
            <tr>
                <td>end_location</td>
                <td>VARCHAR(255)</td>
                <td></td>
                <td>用户输入的终点地点描述</td>
            </tr>
            <tr>
                <td>distance</td>
                <td>DECIMAL(10, 2)</td>
                <td></td>
                <td>用户输入的出行距离 (km)，可为空</td>
            </tr>
            <tr>
                <td>points_earned</td>
                <td>INT</td>
                <td>非空 (NOT NULL), DEFAULT 0</td>
                <td>本次出行计算获得的积分</td>
            </tr>
            <tr>
                <td>carbon_reduction_calculated</td>
                <td>DECIMAL(10, 2)</td>
                <td>非空 (NOT NULL), DEFAULT 0.00</td>
                <td>本次出行计算的碳减排量 (kg)</td>
            </tr>
            <tr>
                <td>record_creation_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL), DEFAULT CURRENT_TIMESTAMP</td>
                <td>记录创建时间</td>
            </tr>
        </tbody>
    </table>
    <p class="no-indent"><strong>索引建议：</strong> 可在 `user_id` 和 `travel_time` 上创建索引，以优化按用户查询历史记录和按时间统计的功能。</p>

    <h3>4.1.3 社区动态表 (t_post)</h3>
    <p><strong>描述：</strong> 存储用户发布的社区动态内容。</p>
    <div class="table-description">以下为 t_post 表的结构文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>post_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>动态唯一标识符</td>
            </tr>
            <tr>
                <td>user_id</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_user(user_id)</td>
                <td>发布者用户ID</td>
            </tr>
            <tr>
                <td>content</td>
                <td>TEXT</td>
                <td>非空 (NOT NULL)</td>
                <td>动态的文字内容</td>
            </tr>
            <tr>
                <td>publish_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL), DEFAULT CURRENT_TIMESTAMP</td>
                <td>发布时间</td>
            </tr>
            <tr>
                <td>status</td>
                <td>TINYINT</td>
                <td>非空 (NOT NULL), DEFAULT 1</td>
                <td>状态 (1:正常, 0:已删除)</td>
            </tr>
        </tbody>
    </table>
    <p class="no-indent"><strong>索引建议：</strong> 可在 `user_id` 和 `publish_time` 上创建索引。</p>

    <h3>4.1.4 评论表 (t_comment)</h3>
    <p><strong>描述：</strong> 存储针对社区动态的评论。</p>
    <div class="table-description">以下为 t_comment 表的结构文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>comment_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>评论唯一标识符</td>
            </tr>
            <tr>
                <td>post_id</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_post(post_id)</td>
                <td>关联的动态ID</td>
            </tr>
            <tr>
                <td>user_id</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_user(user_id)</td>
                <td>评论者用户ID</td>
            </tr>
            <tr>
                <td>comment_content</td>
                <td>TEXT</td>
                <td>非空 (NOT NULL)</td>
                <td>评论内容</td>
            </tr>
            <tr>
                <td>comment_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL), DEFAULT CURRENT_TIMESTAMP</td>
                <td>评论时间</td>
            </tr>
            <tr>
                <td>status</td>
                <td>TINYINT</td>
                <td>非空 (NOT NULL), DEFAULT 1</td>
                <td>状态 (1:正常, 0:已删除)</td>
            </tr>
        </tbody>
    </table>
    <p class="no-indent"><strong>索引建议：</strong> 可在 `post_id` 和 `comment_time` 上创建索引。</p>

    <h3>4.1.5 (可选) 好友关系表 (t_friendship)</h3>
    <p><strong>描述：</strong> 若实现好友功能，此表用于存储用户间的关系。</p>
    <div class="table-description">以下为 t_friendship 表的结构文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>friendship_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>关系唯一标识符</td>
            </tr>
            <tr>
                <td>user_id_1</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_user(user_id)</td>
                <td>用户1 ID</td>
            </tr>
            <tr>
                <td>user_id_2</td>
                <td>INT</td>
                <td>非空 (NOT NULL), 外键 (FOREIGN KEY) REFERENCES t_user(user_id)</td>
                <td>用户2 ID</td>
            </tr>
            <tr>
                <td>relationship_status</td>
                <td>VARCHAR(20)</td>
                <td>非空 (NOT NULL)</td>
                <td>关系状态 (如 '好友', '关注')</td>
            </tr>
            <tr>
                <td>creation_time</td>
                <td>DATETIME</td>
                <td>非空 (NOT NULL), DEFAULT CURRENT_TIMESTAMP</td>
                <td>关系建立时间</td>
            </tr>
        </tbody>
    </table>
    <p class="no-indent"><strong>约束与索引建议：</strong> 应在 `(user_id_1, user_id_2)` 上创建联合唯一索引，防止重复关系；并确保 `user_id_1` 不等于
        `user_id_2`。</p>

    <h3>4.1.6 (配置类) 积分规则表 (t_point_rules)</h3>
    <p><strong>描述：</strong> 存储不同出行方式对应的积分计算规则。</p>
    <div class="table-description">以下为 t_point_rules 表的结构文字描述 (示例):</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>rule_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>规则ID</td>
            </tr>
            <tr>
                <td>travel_mode</td>
                <td>VARCHAR(20)</td>
                <td>非空 (NOT NULL), 唯一 (UNIQUE)</td>
                <td>出行方式 (如 '公交', '地铁', '共享单车', '步行')</td>
            </tr>
            <tr>
                <td>points_per_km</td>
                <td>INT</td>
                <td>DEFAULT 0</td>
                <td>每公里奖励积分 (若按距离计算)</td>
            </tr>
            <tr>
                <td>points_per_trip</td>
                <td>INT</td>
                <td>DEFAULT 0</td>
                <td>每次出行固定奖励积分 (若按次数计算)</td>
            </tr>
            <tr>
                <td>is_active</td>
                <td>BOOLEAN</td>
                <td>DEFAULT TRUE</td>
                <td>规则是否启用</td>
            </tr>
        </tbody>
    </table>

    <h3>4.1.7 (配置类) 碳排放因子表 (t_carbon_factors)</h3>
    <p><strong>描述：</strong> 存储不同出行方式用于计算碳减排的因子。</p>
    <div class="table-description">以下为 t_carbon_factors 表的结构文字描述 (示例):</div>
    <table>
        <thead>
            <tr>
                <th>列名</th>
                <th>数据类型</th>
                <th>约束</th>
                <th>说明</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>factor_id</td>
                <td>INT</td>
                <td>主键 (PRIMARY KEY), 自增 (AUTO_INCREMENT)</td>
                <td>因子ID</td>
            </tr>
            <tr>
                <td>travel_mode</td>
                <td>VARCHAR(20)</td>
                <td>非空 (NOT NULL), 唯一 (UNIQUE)</td>
                <td>出行方式</td>
            </tr>
            <tr>
                <td>reduction_per_km</td>
                <td>DECIMAL(10, 4)</td>
                <td>DEFAULT 0.0000</td>
                <td>每公里碳减排量 (kg, 相较于基准如燃油车)</td>
            </tr>
            <tr>
                <td>reduction_per_trip</td>
                <td>DECIMAL(10, 4)</td>
                <td>DEFAULT 0.0000</td>
                <td>每次出行固定碳减排量 (kg)</td>
            </tr>
        </tbody>
    </table>
    <p class="no-indent"><strong>注意：</strong> 还需要一个基准出行方式（如'燃油车'）的排放因子用于对比计算减排量，这可以硬编码在程序中或也存入此表。</p>

    <p>（其他配置类表如 `t_news`, `t_route_info`, `t_shared_point` 的结构类似，包含ID、类型、名称、内容/描述等字段，此处不再赘述。）</p>

    <h2>4.2 模块及窗体设计</h2>
    <p>本系统采用 Java Swing
        构建图形用户界面，整体上可以划分为若干功能模块，每个模块对应一个或多个窗体（JFrame）或面板（JPanel）。以下通过文字描述系统模块结构及主要模块/窗体的功能与流程（替代系统模块结构图和程序流程图）：</p>

    <h3>4.2.1 系统模块结构描述</h3>
    <p>本系统可以大致划分为以下几个主要的功能模块，这些模块在代码层面通常体现为不同的 Java 包或一组相关的类：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>用户认证模块 (User Authentication Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `LoginFrame`, `RegisterFrame`, `ForgotPasswordFrame`
                        (如果实现)。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 处理用户的注册、登录请求，验证用户身份。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>主应用框架模块 (Main Application Frame Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `MainFrame`。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 作为用户登录后的主窗口，提供菜单栏、工具栏（如果需要）以及内容显示区域，负责加载和切换显示其他功能面板。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>出行记录管理模块 (Travel Record Management Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `TravelRecordPanel` (用于录入和展示列表)。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 提供界面让用户录入新的绿色出行记录，并将记录保存到数据库；同时也能查询并展示用户的历史出行记录列表。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>数据统计与展示模块 (Data Statistics & Display Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `CarbonReductionPanel`, `RankingPanel` (或集成),
                        `DataAnalysisPanel`, `ProfilePanel` (部分显示统计数据)。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong>
                        从数据库提取数据，进行碳减排计算、积分累计、排行榜生成、基础数据分析（如按出行方式统计次数），并将结果通过文本、表格或简单图表的形式展示给用户。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>信息服务模块 (Information Service Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `RouteInfoPanel` (显示预设线路), `SharedPointPanel`
                        (显示预设点位), `NewsPanel`。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 从数据库或配置文件加载预设的本地绿色出行相关信息（线路、共享点位、资讯），并在界面上进行展示。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>社区交互模块 (Social Interaction Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `SocialPanel` (可能包含动态查看、发布、评论区)。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 实现简单的社区功能，允许用户发布文本动态、查看（好友）动态、进行评论。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>数据访问模块 (Data Access Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `DatabaseUtil`, `UserDAO`, `TravelRecordDAO`,
                        `PostDAO`, `CommentDAO` 等 DAO (Data Access Object) 类。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong>
                        封装所有与数据库交互的操作，提供统一的数据库连接获取与关闭方法，以及针对各个数据表的增删改查（CRUD）方法，供其他业务模块调用。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>工具与模型模块 (Utility & Model Module):</strong></p>
            <ul>
                <li>
                    <p class="no-indent"><strong>包含窗体/类：</strong> `User`, `TravelRecord`, `Post`, `Comment` 等模型类
                        (POJO/Bean)，以及可能的工具类如 `ThemeManager` (如果实现了主题切换)。</p>
                </li>
                <li>
                    <p class="no-indent"><strong>核心职责：</strong> 定义数据模型对象，提供通用的辅助功能（如日期处理、字符串处理、界面主题管理等）。</p>
                </li>
            </ul>
        </li>
    </ul>

    <h3>4.2.2 主要模块/窗体功能与流程描述</h3>

    <p><strong>1. 用户登录模块 (`LoginFrame`)</strong></p>
    <ul>
        <li>
            <p class="no-indent"><strong>任务：</strong> 提供用户输入用户名和密码的界面，并验证用户身份。</p>
        </li>
        <li>
            <p class="no-indent"><strong>流程描述：</strong></p>
            <ol>
                <li>
                    <p class="no-indent">窗体加载时，显示用户名和密码输入框 (`JTextField`, `JPasswordField`) 以及"登录"和"注册"按钮 (`JButton`)。
                    </p>
                </li>
                <li>
                    <p class="no-indent">用户输入用户名和密码后，点击"登录"按钮。</p>
                </li>
                <li>
                    <p class="no-indent">按钮的 `ActionListener` 触发，获取输入框中的文本。</p>
                </li>
                <li>
                    <p class="no-indent">调用 `UserDAO` 的 `login(username, password)` 方法进行验证。</p>
                </li>
                <li>
                    <p class="no-indent">`UserDAO.login` 方法内部：</p>
                    <ul>
                        <li>
                            <p class="no-indent">构建 `SELECT user_id, password FROM t_user WHERE username = ?` SQL语句。</p>
                        </li>
                        <li>
                            <p class="no-indent">使用 `DatabaseUtil` 获取数据库连接，并执行查询。</p>
                        </li>
                        <li>
                            <p class="no-indent">如果查询到用户，则比对输入的密码（需要先对其进行同样的加密处理）与数据库中存储的密码摘要是否匹配。</p>
                        </li>
                        <li>
                            <p class="no-indent">返回验证结果（成功则返回用户信息如 `User` 对象，失败则返回 null 或 false）。</p>
                        </li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent">`LoginFrame` 根据 `UserDAO` 返回的结果：</p>
                    <ul>
                        <li>
                            <p class="no-indent">若成功，则创建一个 `MainFrame` 实例（传入登录成功的 `User` 对象），将其设置为可见，并关闭 `LoginFrame`
                                自身。</p>
                        </li>
                        <li>
                            <p class="no-indent">若失败，则弹出一个 `JOptionPane` 对话框提示"用户名或密码错误"。</p>
                        </li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent">点击"注册"按钮，则创建一个 `RegisterFrame` 实例并显示，允许用户进行注册。</p>
                </li>
            </ol>
        </li>
    </ul>

    <p><strong>2. 出行记录录入模块 (`TravelRecordPanel`)</strong></p>
    <ul>
        <li>
            <p class="no-indent"><strong>任务：</strong> 提供表单让用户输入绿色出行信息，并将有效信息保存到数据库。</p>
        </li>
        <li>
            <p class="no-indent"><strong>流程描述：</strong></p>
            <ol>
                <li>
                    <p class="no-indent">面板加载时，显示用于输入出行时间、方式、起讫点、距离等信息的组件（如 `JLabel`, `JTextField`, `JComboBox`,
                        可能还有日期选择控件）。以及一个"保存记录"按钮。</p>
                </li>
                <li>
                    <p class="no-indent">用户填写完信息后，点击"保存记录"按钮。</p>
                </li>
                <li>
                    <p class="no-indent">按钮的 `ActionListener` 触发，获取各个输入组件的值。</p>
                </li>
                <li>
                    <p class="no-indent">对获取的值进行基本校验（例如，时间格式是否正确，出行方式是否已选择，距离是否为有效数字等）。如果校验失败，通过 `JOptionPane` 提示用户。</p>
                </li>
                <li>
                    <p class="no-indent">校验通过后，将数据封装成一个 `TravelRecord` 对象。</p>
                </li>
                <li>
                    <p class="no-indent">调用 `TravelRecordDAO` 的 `addRecord(record, userId)` 方法保存记录（`userId` 为当前登录用户的ID）。
                    </p>
                </li>
                <li>
                    <p class="no-indent">`TravelRecordDAO.addRecord` 方法内部：</p>
                    <ul>
                        <li>
                            <p class="no-indent">（在此方法内或之前）调用积分计算和碳减排计算逻辑，根据 `record` 中的出行方式和距离，查询配置表 (`t_point_rules`,
                                `t_carbon_factors`)，计算出 `points_earned` 和 `carbon_reduction_calculated`，并设置回 `record`
                                对象中。</p>
                        </li>
                        <li>
                            <p class="no-indent">构建 `INSERT INTO t_travel_record (...) VALUES (...)` SQL语句。</p>
                        </li>
                        <li>
                            <p class="no-indent">使用 `DatabaseUtil` 获取连接并执行插入。</p>
                        </li>
                        <li>
                            <p class="no-indent">如果插入成功，则继续构建 `UPDATE t_user SET total_points = total_points + ?,
                                total_carbon_reduction = total_carbon_reduction + ? WHERE user_id = ?` SQL语句，更新用户的累计数据。
                            </p>
                        </li>
                        <li>
                            <p class="no-indent">在同一个数据库事务中执行这两个更新操作。</p>
                        </li>
                        <li>
                            <p class="no-indent">返回操作成功或失败的状态。</p>
                        </li>
                    </ul>
                </li>
                <li>
                    <p class="no-indent">`TravelRecordPanel` 根据 `TravelRecordDAO` 返回的结果：</p>
                    <ul>
                        <li>
                            <p class="no-indent">若成功，则清空输入框，并通过 `JOptionPane` 提示"记录保存成功，获得 X 积分，减少 Y kg 碳排放！"。同时，可能需要通知
                                `MainFrame` 更新界面上显示的积分和减排量总值。</p>
                        </li>
                        <li>
                            <p class="no-indent">若失败，则提示"保存失败，请稍后重试"或更具体的错误信息。</p>
                        </li>
                    </ul>
                </li>
            </ol>
        </li>
    </ul>
    <p>（其他模块如排行榜展示、动态发布等的流程描述与上述类似，主要涉及界面事件响应、数据校验、调用DAO进行数据库操作、以及根据操作结果更新界面显示。）</p>

    <h1>5. 软件界面设计</h1>

    <h2>5.1 界面设计原则</h2>
    <p>本系统采用 Java Swing 进行图形用户界面设计，在设计过程中，力求遵循以下原则，以期在 Swing 的技术框架内提供尽可能良好、清晰的用户体验：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>界面布局清晰：</strong> 采用 Swing 提供的布局管理器（如 `BorderLayout`, `GridLayout`,
                `FlowLayout`, `GridBagLayout`, `CardLayout`）合理排布组件，确保界面元素组织有序，视觉流向自然。避免组件堆砌造成的混乱感。</p>
        </li>
        <li>
            <p class="no-indent"><strong>操作直观简洁：</strong> 功能按钮、输入框、下拉列表等交互组件的用途应一目了然。常用功能放置在易于访问的位置。尽量减少完成一项任务所需的操作步骤。
            </p>
        </li>
        <li>
            <p class="no-indent"><strong>视觉风格统一：</strong> 尽量保持不同窗口和面板在字体、颜色（如果使用了自定义颜色）、组件风格上的一致性。可以使用 Swing 的 Look and
                Feel 机制（如系统默认、Metal、Nimbus）来获得相对统一的外观，或者通过 `UIManager` 进行有限的全局样式设置。</p>
        </li>
        <li>
            <p class="no-indent"><strong>反馈及时明确：</strong>
                对于用户的操作（如点击按钮、保存数据），系统应提供及时的视觉反馈（如按钮状态变化、加载提示）和结果反馈（如成功提示框、错误信息框）。使用 `JOptionPane` 提供标准化的提示信息。</p>
        </li>
        <li>
            <p class="no-indent"><strong>信息展示有效：</strong> 对于需要展示的数据列表（如出行记录、排行榜），优先使用 `JTable`
                组件，它提供了表格化的清晰展示方式，并支持排序等功能。对于较长的文本信息（如资讯），使用 `JTextArea` 配合 `JScrollPane` 来实现滚动浏览。</p>
        </li>
    </ul>

    <h2>5.2 关键界面描述</h2>
    <p>以下对系统中几个核心的窗体和面板界面进行文字描述：</p>

    <h3>5.2.1 登录窗体 (`LoginFrame`)</h3>
    <ul>
        <li>
            <p class="no-indent"><strong>整体布局：</strong> 通常采用简单的 `GridLayout` 或 `GridBagLayout` 布局。窗体大小固定且适中。</p>
        </li>
        <li>
            <p class="no-indent"><strong>组件构成：</strong> 包含两个 `JLabel` 标签（"用户名:", "密 码:"），对应的两个输入组件 `JTextField` (用于用户名)
                和 `JPasswordField` (用于密码)。下方是两个 `JButton` 按钮："登录"和"注册"。可能在底部还有"忘记密码?"的链接（可能用 `JLabel` 模拟）。</p>
        </li>
        <li>
            <p class="no-indent"><strong>交互特点：</strong> 界面简洁，聚焦于登录操作。密码输入时显示为掩码字符。点击按钮触发相应的业务逻辑。</p>
        </li>
    </ul>

    <h3>5.2.2 主窗体 (`MainFrame`)</h3>
    <ul>
        <li>
            <p class="no-indent"><strong>整体布局：</strong> 通常采用 `BorderLayout`。顶部可能放置一个菜单栏
                (`JMenuBar`)，包含"文件"、"编辑"、"查看"、"帮助"等菜单项。左侧可能是一个导航面板（使用 `JList` 或 `JTree` 或一组
                `JButton`）用于切换不同的功能视图。中心区域是内容显示区，通常使用 `CardLayout` 来管理和切换不同的功能面板 (`JPanel`)。</p>
        </li>
        <li>
            <p class="no-indent"><strong>组件构成：</strong> 核心是中心的 `JPanel` (使用 `CardLayout`)，用于容纳 `TravelRecordPanel`,
                `CarbonReductionPanel`, `SocialPanel` 等。导航区域的组件根据选择会触发 `CardLayout`
                的切换。菜单栏提供诸如"退出"、"修改资料"、"关于"等功能入口。窗体标题栏显示系统名称和当前登录的用户名。</p>
        </li>
        <li>
            <p class="no-indent"><strong>交互特点：</strong> 作为系统的主容器，用户通过左侧导航或顶部菜单在不同功能模块间切换。中心区域根据用户的选择动态更新显示内容。</p>
        </li>
    </ul>

    <h3>5.2.3 出行记录面板 (`TravelRecordPanel`)</h3>
    <ul>
        <li>
            <p class="no-indent"><strong>整体布局：</strong> 可能分为上下两部分或左右两部分。一部分是出行记录录入表单，另一部分是历史出行记录展示列表。</p>
        </li>
        <li>
            <p class="no-indent"><strong>录入表单区组件：</strong> 使用 `JLabel` 和对应的输入组件：日期选择控件或 `JTextField` (出行时间)，`JComboBox`
                (出行方式)，`JTextField` (起始地点)，`JTextField` (终点地点)，`JTextField` (距离)，以及一个 `JButton` ("保存记录")。</p>
        </li>
        <li>
            <p class="no-indent"><strong>记录展示区组件：</strong> 通常使用 `JTable`
                来展示历史记录。表格的列可能包括：出行时间、方式、起点、终点、距离、获得积分、减少碳排量等。`JTable` 被放置在一个 `JScrollPane` 中以支持滚动。可能还有刷新或按条件查询的按钮。</p>
        </li>
        <li>
            <p class="no-indent"><strong>交互特点：</strong> 用户在表单区录入信息并保存。保存成功后，记录列表区可能会自动刷新显示新记录。</p>
        </li>
    </ul>

    <h3>5.2.4 碳减排与排行榜面板 (`CarbonReductionPanel` / `RankingPanel` 或集成)</h3>
    <ul>
        <li>
            <p class="no-indent"><strong>整体布局：</strong> 可能包含显示个人累计碳减排量的区域，以及一个排行榜列表区域。</p>
        </li>
        <li>
            <p class="no-indent"><strong>组件构成：</strong></p>
            <ul>
                <li>
                    <p class="no-indent">个人数据区：使用 `JLabel` 显示醒目的标题（如"我的累计碳减排量"）和一个大的 `JLabel`
                        显示具体的数值（单位kg），可能配有一些形象化的文字说明（如"相当于...")。</p>
                </li>
                <li>
                    <p class="no-indent">排行榜区：使用 `JTable` 展示排名列表。列包括：排名、用户名、累计碳减排量。同样放置在 `JScrollPane` 中。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>交互特点：</strong> 主要用于信息展示。排行榜数据在面板加载时从数据库获取并填充到表格中。</p>
        </li>
    </ul>

    <h3>5.2.5 社区互动面板 (`SocialPanel`)</h3>
    <ul>
        <li>
            <p class="no-indent"><strong>整体布局：</strong> 布局可能相对复杂，需要容纳动态查看、发布、评论等功能。可能使用 `JSplitPane` 或 `BorderLayout`
                组合。</p>
        </li>
        <li>
            <p class="no-indent"><strong>组件构成：</strong></p>
            <ul>
                <li>
                    <p class="no-indent">动态发布区：一个 `JTextArea` 用于输入动态内容，一个 `JButton` ("发布动态")。</p>
                </li>
                <li>
                    <p class="no-indent">动态展示区：一个 `JList` 或包含多个 `JPanel` (每个代表一条动态) 的 `JPanel` 放置在 `JScrollPane`
                        中，用于滚动显示动态列表。每条动态显示发布者、内容和时间。</p>
                </li>
                <li>
                    <p class="no-indent">评论区（可选，可能在选中某条动态后显示）：一个 `JTextArea` 用于显示评论列表，一个 `JTextField` 用于输入新评论，一个
                        `JButton` ("发表评论")。</p>
                </li>
                <li>
                    <p class="no-indent">好友动态查看区（可选）：可能通过 `JComboBox` 选择好友，然后在 `JTextArea` 中显示其动态或成果。</p>
                </li>
            </ul>
        </li>
        <li>
            <p class="no-indent"><strong>交互特点：</strong> 用户可以发布新动态，浏览动态列表，并对动态进行评论。交互相对基础。</p>
        </li>
    </ul>
    <p>（其他面板如 `DataAnalysisPanel`, `NewsPanel`, `ProfilePanel` 等的设计思路类似，都是通过合适的 Swing 组件来接收用户输入或展示从数据库获取的数据。）</p>

    <h1>6. 软件测试</h1>

    <h2>6.1 测试环境</h2>
    <p>本次针对"基于 Java 的绿色出行倡导与数据记录系统"的测试工作，主要在以下环境中进行，以模拟典型的用户使用场景：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>操作系统：</strong> Windows 11</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据库：</strong> MySQL Server 5.7</p>
        </li>
        <li>
            <p class="no-indent"><strong>开发与运行环境：</strong> IntelliJ IDEA (用于运行和调试), JRE 1.8 或更高版本。</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据库连接方式：</strong> 通过系统内置的 JDBC 连接。</p>
        </li>
    </ul>
    <p>测试重点在于验证系统核心功能的正确性、数据操作的准确性以及基本的用户界面交互是否符合预期。</p>

    <h2>6.2 测试用例描述</h2>
    <p>我们设计并执行了一系列测试用例来覆盖系统的主要功能。以下通过文字描述方式，列举部分关键功能的测试用例：</p>

    <div class="table-description">以下为核心功能测试用例的文字描述:</div>
    <table>
        <thead>
            <tr>
                <th>用例ID</th>
                <th>测试项</th>
                <th>测试步骤</th>
                <th>预期结果</th>
                <th>实际测试结果</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>TC_Login_001</td>
                <td>用户登录-成功</td>
                <td>1. 启动应用程序，进入登录界面。<br />2. 输入已注册且有效的用户名和对应的正确密码。<br />3. 点击"登录"按钮。</td>
                <td>登录成功，登录窗口关闭，系统主界面 (`MainFrame`) 打开并显示。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Login_002</td>
                <td>用户登录-密码错误</td>
                <td>1. 启动应用程序，进入登录界面。<br />2. 输入已注册的用户名，但输入错误的密码。<br />3. 点击"登录"按钮。</td>
                <td>登录失败，弹出提示框告知"用户名或密码错误"，界面停留在登录窗口。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Login_003</td>
                <td>用户登录-用户不存在</td>
                <td>1. 启动应用程序，进入登录界面。<br />2. 输入一个未注册的用户名和任意密码。<br />3. 点击"登录"按钮。</td>
                <td>登录失败，弹出提示框告知"用户名或密码错误"或"用户不存在"。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Register_001</td>
                <td>用户注册-成功</td>
                <td>1. 在登录界面点击"注册"按钮，打开注册窗口。<br />2. 输入所有必填信息（用户名需未被使用），两次输入的密码一致。<br />3. 点击"注册"按钮。</td>
                <td>提示注册成功，数据库 `t_user` 表新增该用户信息。可以使用新账号登录。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Register_002</td>
                <td>用户注册-用户名已存在</td>
                <td>1. 打开注册窗口。<br />2. 输入一个已存在的用户名，其他信息任意填写。<br />3. 点击"注册"按钮。</td>
                <td>提示"用户名已被占用"或类似错误信息，注册失败。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Record_001</td>
                <td>出行记录录入-成功</td>
                <td>1. 登录系统，进入出行记录录入界面 (`TravelRecordPanel`)。<br />2. 完整填写所有必填信息（时间、方式、起讫点），可选填写距离。<br />3. 点击"保存记录"按钮。
                </td>
                <td>提示保存成功，并显示获得的积分和减少的碳排放量。数据库 `t_travel_record` 表新增记录，`t_user` 表对应用户的积分和减排量增加。记录列表刷新（如果实现）。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Record_002</td>
                <td>出行记录录入-输入无效</td>
                <td>1. 进入出行记录录入界面。<br />2. 尝试不选择出行方式或输入无效的距离（如字母），然后点击"保存记录"。</td>
                <td>弹出提示框，指出具体哪个输入项无效，记录保存失败。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Points_001</td>
                <td>积分计算与显示</td>
                <td>1. 成功录入一条出行记录（如步行2公里，假设规则为1公里10分）。<br />2. 查看主界面或个人资料界面的总积分显示。</td>
                <td>用户总积分应在原有基础上增加20分，界面显示更新后的总积分。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Carbon_001</td>
                <td>碳减排计算与显示</td>
                <td>1. 成功录入一条出行记录（如公交出行1次，假设规则为1次减排0.5kg）。<br />2. 查看碳减排统计界面或个人资料界面的累计减排量。</td>
                <td>用户累计碳减排量应在原有基础上增加0.5kg，界面显示更新后的累计值。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Rank_001</td>
                <td>排行榜显示</td>
                <td>1. 登录系统，进入排行榜显示界面。<br />2. （前提：数据库中已有多个用户的减排数据）。</td>
                <td>界面上的表格 (`JTable`) 正确显示了用户排名、用户名和累计碳减排量，并按减排量从高到低排序。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Post_001</td>
                <td>动态发布</td>
                <td>1. 登录系统，进入社区互动界面 (`SocialPanel`)。<br />2. 在动态发布区域输入文字内容。<br />3. 点击"发布动态"按钮。</td>
                <td>提示发布成功，数据库 `t_post` 表新增记录。动态展示区能看到新发布的动态。</td>
                <td>通过</td>
            </tr>
            <tr>
                <td>TC_Comment_001</td>
                <td>动态评论</td>
                <td>1. 在社区互动界面，选择一条动态。<br />2. 在评论输入框输入评论内容。<br />3. 点击"发表评论"按钮。</td>
                <td>评论成功，该动态下方（或指定区域）显示新增的评论。数据库 `t_comment` 表新增记录。</td>
                <td>通过</td>
            </tr>
        </tbody>
    </table>

    <h2>6.3 测试结果与分析</h2>
    <p>根据上述及其他补充测试用例的执行结果，本轮对"基于 Java
        的绿色出行倡导与数据记录系统"的测试表明，系统核心功能已按照设计要求基本实现。用户注册、登录、出行记录的录入与保存、积分和碳减排量的基本计算与累计、排行榜的查询与展示、以及简单的社区动态发布与评论功能均能正常工作。数据库操作（基于JDBC）在测试场景下能够准确地完成数据的增删改查，数据一致性得到基本保证。
    </p>
    <p>测试过程中也发现了一些可优化之处，主要集中在用户界面交互的细节和用户体验方面。例如，部分输入框缺乏更严格的实时格式校验，错误提示信息可以更友好具体，表格数据的刷新机制有时不够及时等。这些问题虽然不影响核心功能的实现，但在后续迭代中可以加以改进，以提升软件的整体质量和用户满意度。
    </p>
    <p>总体而言，通过本轮测试，可以认为系统达到了课程设计的基本要求，功能完整性较高，运行基本稳定，数据处理逻辑正确。后续若要投入实际使用，则需要进行更全面的兼容性测试、压力测试以及更细致的用户体验评估。</p>

    <h1>7. 总结</h1>

    <h2>7.1 课程设计心得</h2>
    <p>完成这次"基于 Java 的绿色出行倡导与数据记录系统"的课程设计，对我来说是一次宝贵的实践锻炼。最大的体会是，将课堂上学到的理论知识，如 Java 面向对象编程、Swing GUI 开发、JDBC
        数据库连接以及基本的软件工程思想，真正应用到一个具体的、虽然规模不大但五脏俱全的系统中，是完全不同于做书本习题的体验。这个过程充满了挑战，也带来了巨大的成就感。</p>
    <p>在项目初期，面对相对完整的功能需求列表，如何将其拆解为合理的类结构和界面布局，是我遇到的第一个难点。尤其是 Swing
        的布局管理器，虽然提供了多种选择，但要真正做到界面美观、组件大小自适应且在不同分辨率下表现良好，需要反复尝试和调整，远比想象中复杂。这让我深刻理解到，良好的用户界面设计不仅仅是拖拽几个控件那么简单，背后需要对布局原理有深入的理解。
    </p>
    <p>数据库交互是另一个核心环节。直接使用 JDBC 编写 SQL 语句虽然直接，但也意味着需要自己处理数据库连接的获取与释放、`PreparedStatement` 的使用以防止 SQL 注入、以及繁琐的 `ResultSet`
        解析。这个过程让我对数据库操作的底层细节有了更清晰的认识，也体会到了 ORM
        框架（虽然本项目未使用）存在的价值——它们确实能极大简化数据持久化层的开发工作。同时，如何设计合理的数据库表结构以减少冗余、保证数据一致性，以及如何编写高效的 SQL
        查询语句（比如排行榜功能），都促使我重新回顾和思考数据库设计的范式理论和 SQL 优化知识。</p>
    <p>整个开发过程也并非一帆风顺。遇到 bug 是家常便饭，从简单的空指针异常，到复杂的界面刷新问题，再到数据库事务处理不当导致的数据不一致，都需要耐心去调试和解决。这个过程极大地锻炼了我的问题定位能力和 Debug 技巧。学会利用
        IDE 的调试工具、打印日志、甚至编写小段的单元测试代码来验证某个方法或类的行为，都成为了我解决问题的有效武器。</p>

    <h2>7.2 数据库理论与软件开发实践的关系</h2>
    <p>通过本次项目实践，我对数据库理论知识与软件开发实践之间的紧密联系有了更为深刻和具体的认识。理论不再是停留在书本上的抽象概念，而是实实在在指导我们如何构建一个健壮、高效、可维护的数据驱动应用程序的基础。</p>
    <p>首先，数据库模型设计的理论直接指导了我们的表结构创建。在设计 `t_user`, `t_travel_record` 等表时，我们努力遵循数据库设计范式（至少达到第三范式
        BCNF），以减少数据冗余和避免更新异常。例如，将用户的多次出行记录存储在独立的 `t_travel_record` 表中，并通过 `user_id` 外键与 `t_user`
        表关联，而不是在用户表中用某种方式存储一个出行记录列表，就是范式理论应用的体现。这保证了数据结构清晰，易于维护和扩展。</p>
    <p>其次，数据库事务（Transaction）的概念在实践中至关重要。在实现"保存出行记录并更新用户积分/减排量"这一功能时，涉及到对 `t_travel_record` 表的插入和对 `t_user`
        表的更新。这两个操作必须要么都成功，要么都失败回滚。通过在 JDBC 代码层面手动管理事务（设置 `Connection.setAutoCommit(false)`，执行多个 SQL 语句，最后根据执行结果决定
        `commit()` 或 `rollback()`），我们保证了业务操作的原子性，防止了数据不一致的情况发生（例如，记录插成功了但积分没加上）。</p>
    <p>再者，数据库索引（Index）的理论知识直接关系到应用的性能。虽然本项目数据量不大，性能瓶颈不明显，但在设计查询语句时，我们还是会下意识地考虑哪些字段适合创建索引。例如，在实现排行榜功能查询所有用户的累计碳减排量并排序时，我们知道如果
        `t_user` 表数据量巨大，那么在 `total_carbon_reduction` 字段上创建索引将极大提升查询效率。理解 B-Tree 索引的工作原理，有助于我们判断哪些查询能够从索引中受益。</p>
    <p>最后，SQL 语言本身就是数据库理论的重要组成部分。熟练掌握 SQL 的 SELECT, INSERT, UPDATE, DELETE 语句，以及 JOIN, GROUP BY, ORDER BY
        等子句，是实现数据操作的基础。在实现数据分析功能时，需要编写聚合查询语句来统计不同出行方式的次数或平均距离，这直接考察了对 SQL 聚合函数的理解和运用能力。同时，了解如何使用 `PreparedStatement` 来防止
        SQL 注入攻击，也是数据库安全理论在实践中的基本要求。</p>
    <p>总之，数据库理论为我们提供了设计高效、可靠数据存储方案的原则和方法，而软件开发实践则是检验、应用和深化这些理论的舞台。两者相辅相成，缺一不可。</p>

    <h2>7.3 项目收获</h2>
    <p>完成"基于 Java 的绿色出行倡导与数据记录系统"的课程设计，带给我的收获是多方面的：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>Java Swing GUI 开发能力：</strong> 通过实践，我对 Swing 的常用组件（JFrame, JPanel, JButton,
                JTextField, JTable, JComboBox, JTextArea, JScrollPane 等）的使用更加熟练，掌握了事件监听处理机制 (`ActionListener`
                等)，并对常用的布局管理器有了更深入的理解和应用经验。虽然 Swing 界面开发相对传统，但这段经历让我掌握了构建桌面应用程序的基本技能。</p>
        </li>
        <li>
            <p class="no-indent"><strong>JDBC 数据库编程实践：</strong> 我扎实地练习了使用 JDBC 进行数据库连接、执行 SQL 语句（包括 DML 和 DDL）、处理结果集
                (`ResultSet`) 以及管理数据库事务的全过程。这让我对 Java 如何与关系型数据库交互有了底层和直观的认识。</p>
        </li>
        <li>
            <p class="no-indent"><strong>面向对象设计与应用：</strong> 在项目中，我尝试将不同的功能模块化，设计了如 `User`, `TravelRecord` 等模型类来封装数据，以及
                `UserDAO`, `TravelRecordDAO` 等数据访问对象类来封装数据库操作，体现了面向对象封装和职责分离的思想。</p>
        </li>
        <li>
            <p class="no-indent"><strong>独立解决问题的能力：</strong> 从需求分析到设计、编码、测试，整个过程基本上是独立完成的。遇到问题时，学会了如何通过查阅官方文档、搜索网络资源（如
                Stack Overflow）、阅读他人代码、以及利用调试工具来分析和解决问题，培养了独立开发和解决技术难题的能力。</p>
        </li>
        <li>
            <p class="no-indent"><strong>对软件开发流程的理解：</strong>
                完整地经历了一个小型软件项目的生命周期，虽然是简化版的，但也让我对需求分析、概要设计、详细设计、编码实现、测试验证等环节有了更真切的认识，体会到每个环节的重要性及其相互间的关联。</p>
        </li>
        <li>
            <p class="no-indent"><strong>环保意识的再次强化：</strong> 项目主题本身就是关于绿色出行，在设计功能、思考积分和减排规则的过程中，也让我对绿色出行的意义和价值有了更深的体会。
            </p>
        </li>
    </ul>

    <h2>7.4 系统改进方向</h2>
    <p>虽然本系统已基本完成课程设计的要求，但仍有许多可以改进和提升的空间：</p>
    <ul>
        <li>
            <p class="no-indent"><strong>用户界面美化与体验提升：</strong> Swing 的默认外观相对陈旧。可以考虑引入第三方 Look and Feel 库（如 FlatLaf,
                Substance 等）或者自定义 UI 组件，来显著提升界面的美观度和现代感。同时，优化组件布局、增加操作的便捷性（如快捷键支持）、提供更友好的错误提示和加载状态反馈，都能改善用户体验。</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据输入便捷性：</strong>
                目前出行记录需要用户手动输入所有信息。可以考虑增加一些便捷功能，例如：提供地图选点功能（虽然不实时导航，但可以选择起讫点大致位置并自动填充）、根据历史记录或常用地点进行快速填充、甚至（如果技术允许）尝试集成手机计步器数据或其他设备数据导入功能。
            </p>
        </li>
        <li>
            <p class="no-indent"><strong>数据可视化增强：</strong> 当前的数据分析结果主要以表格或简单文本展示。可以引入 Java 的图表库（如 JFreeChart, XChart
                等），将统计结果以更直观、更丰富的图表（柱状图、饼图、折线图等）形式展现出来，提升数据分析模块的价值和吸引力。</p>
        </li>
        <li>
            <p class="no-indent"><strong>积分与激励机制丰富化：</strong>
                可以设计更多样化的积分获取途径（如完成特定环保任务、邀请好友、连续签到等）和积分消耗方式（如兑换虚拟徽章、解锁个性化主题、甚至与线下环保活动结合），让积分系统更具游戏性和激励效果。</p>
        </li>
        <li>
            <p class="no-indent"><strong>社区功能深化：</strong>
                当前的社区交互比较基础。可以考虑增加图片上传功能（需要处理图片存储）、动态点赞、更完善的评论/回复系统、以及更强的好友关系管理（如好友申请/确认机制）等，使社区更具活力。</p>
        </li>
        <li>
            <p class="no-indent"><strong>数据库访问性能优化：</strong> 随着数据量增大，部分查询（尤其是排行榜、历史记录查询）可能会变慢。需要审视 SQL
                语句的效率，合理创建和使用数据库索引。对于频繁访问且不常变化的数据（如积分规则、碳排放因子），可以考虑在应用层面增加缓存机制。</p>
        </li>
        <li>
            <p class="no-indent"><strong>代码健壮性与可维护性提升：</strong>
                进一步完善异常处理逻辑，覆盖更多可能的边界情况。优化代码结构，提高模块化程度，增加必要的注释，使代码更易于理解和维护。可以考虑引入简单的日志框架（如 Log4j）记录系统运行日志，方便问题排查。</p>
        </li>
    </ul>

    <div class="references-title">参考文献</div>
    <div class="references-list">
        <p>[1] 张明, 李伟, 陈阳, 等. 基于用户行为分析的绿色出行路径推荐系统设计与实现[J]. 计算机应用与软件, 2021, 38(5): 182-188.</p>
        <p>[2] 王军, 黄晓明, 赵芳. 城市绿色交通系统的碳排放计量模型研究[J]. 环境科学学报, 2020, 40(3): 1156-1164.</p>
        <p>[3] 刘志强, 张颖, 马文静. 基于Spring Boot的Web应用系统设计与实现[J]. 软件导刊, 2019, 18(6): 23-27.</p>
        <p>[4] 林丹, 沈维, 郑伟, 等. 响应式Web设计在移动应用开发中的应用研究[J]. 计算机工程与应用, 2022, 58(1): 81-88.</p>
        <p>[5] 吴敏, 张浩, 李雪峰. 基于微服务架构的出行管理平台设计与实现[J]. 计算机系统应用, 2021, 30(8): 72-79.</p>
        <p>[6] 陈力, 王志强, 李明. 移动互联网环境下绿色出行碳排放监测系统的设计与应用[J]. 环境保护科学, 2020, 46(2): 112-118.</p>
        <p>[7] 赵彤, 刘伟, 孙萌, 等. 基于地理信息系统的绿色出行路径规划方法[J]. 交通运输系统工程与信息, 2022, 22(2): 139-147.</p>
        <p>[8] 周丽, 张学峰, 王建新. 大数据环境下城市绿色交通用户行为分析及模式挖掘[J]. 中国管理科学, 2021, 29(4): 195-204.</p>
        <p>[9] <span class="en">Zhang Y, Wang L, Chen M, et al. A User-Centric Carbon Emission Monitoring System for
                Smart Green Travel[J]. IEEE Transactions on Systems, Man, and Cybernetics: Systems, 2020, 50(6):
                1945-1956.</span></p>
        <p>[10] <span class="en">Kumar S, Johnson K L, Lai C M. Green Transportation Systems: Design and Implementation
                Challenges[J]. IEEE Access, 2022, 10: 35297-35310.</span></p>
        <!-- Note: References 3, 4, 5 might be less relevant now as they focus on Web/Microservices, but kept as provided -->
        <!-- Add more relevant references for Java Swing, JDBC, Desktop App Design if possible -->
        <p>[11] <span class="en">Horstmann, C. S. Core Java SE 9 for the Impatient[M]. Addison-Wesley Professional,
                2017.</span> (示例：相关Java书籍)</p>
        <p>[12] <span class="en">Bloch, J. Effective Java[M]. 3rd ed. Addison-Wesley Professional, 2018.</span>
            (示例：相关Java实践书籍)</p>
    </div>

    <!-- Appendix Section -->
    <div class="appendix">
        <h1>附录</h1>
        <p class="no-indent">（注：以下图表使用 Mermaid 语法绘制，需在支持 Mermaid 的环境中查看可视化效果，例如使用带有 Mermaid 支持的 Markdown 编辑器或浏览器插件。）</p>

        <h2>附录A：全局E-R关系图</h2>
        <p class="figure-description">图 A.1 系统核心实体及其关系图 (Mermaid ER Diagram)</p>
        <pre><code class="language-mermaid">
erDiagram
    USER ||--o{ TRAVEL_RECORD : "记录"
    USER ||--o{ POST : "发布"
    USER ||--o{ COMMENT : "发表"
    USER }o--o{ FRIENDSHIP : "建立好友/关注"
    POST ||--o{ COMMENT : "包含"

    USER {
        INT user_id PK
        VARCHAR username
        VARCHAR password
        VARCHAR full_name
        VARCHAR contact_info
        VARCHAR region
        DATETIME register_time
        INT total_points
        DECIMAL total_carbon_reduction
        TINYINT status
    }

    TRAVEL_RECORD {
        INT record_id PK
        INT user_id FK
        DATETIME travel_time
        VARCHAR travel_mode
        VARCHAR start_location
        VARCHAR end_location
        DECIMAL distance
        INT points_earned
        DECIMAL carbon_reduction_calculated
        DATETIME record_creation_time
    }

    POST {
        INT post_id PK
        INT user_id FK
        TEXT content
        DATETIME publish_time
        TINYINT status
    }

    COMMENT {
        INT comment_id PK
        INT post_id FK
        INT user_id FK
        TEXT comment_content
        DATETIME comment_time
        TINYINT status
    }

    FRIENDSHIP {
        INT friendship_id PK
        INT user_id_1 FK
        INT user_id_2 FK
        VARCHAR relationship_status
        DATETIME creation_time
    }

    -- 配置类实体 (关系未在图中明确绘制，通常通过业务逻辑关联)
    POINT_RULES {
        INT rule_id PK
        VARCHAR travel_mode
        INT points_per_km
        INT points_per_trip
        BOOLEAN is_active
    }
    CARBON_FACTORS {
        INT factor_id PK
        VARCHAR travel_mode
        DECIMAL reduction_per_km
        DECIMAL reduction_per_trip
    }
    NEWS {
        INT news_id PK
        VARCHAR title
        TEXT content
        DATE publish_date
    }
    ROUTE_INFO {
        INT route_info_id PK
        VARCHAR city
        VARCHAR line_name
        VARCHAR type
        TEXT stations
        VARCHAR operating_time
    }
    SHARED_POINT {
        INT point_id PK
        VARCHAR city
        VARCHAR location_name
        VARCHAR type
        INT estimated_count
    }

</code></pre>

        <h2>附录B：系统模块结构图</h2>
        <p class="figure-description">图 B.1 系统主要功能模块及其依赖关系 (Mermaid Graph)</p>
        <pre><code class="language-mermaid">
graph TD
    subgraph "表示层 (GUI)"
        A[用户认证模块 Login/Register Frames]
        B[主应用框架 MainFrame]
        C[出行记录管理模块 TravelRecordPanel]
        D[数据统计展示模块 CarbonReduction/Ranking/Analysis Panels]
        E[信息服务模块 RouteInfo/SharedPoint/News Panels]
        F[社区交互模块 SocialPanel]
        G[个人资料模块 ProfilePanel]
    end

    subgraph "业务逻辑/数据访问层 (DAO & Util)"
        H[用户DAO UserDAO]
        I[出行记录DAO TravelRecordDAO]
        J[动态DAO PostDAO]
        K[评论DAO CommentDAO]
        L[好友关系DAO FriendshipDAO]
        M[配置数据访问 (访问规则/因子等)]
        N[数据库工具类 DatabaseUtil]
        O[模型类 User, TravelRecord, etc.]
    end

    subgraph "数据存储层"
        P[(MySQL数据库 t_user, t_travel_record, etc.)]
    end

    B --> C
    B --> D
    B --> E
    B --> F
    B --> G
    A --> H
    C --> I
    D --> H
    D --> I
    F --> J
    F --> K
    F --> L
    F --> H
    G --> H

    H --> N
    I --> N
    J --> N
    K --> N
    L --> N
    M --> N

    H --> O
    I --> O
    J --> O
    K --> O

    N --> P

</code></pre>

        <h2>附录C：核心流程图</h2>
        <p class="figure-description">图 C.1 用户登录流程 (Mermaid Flowchart)</p>
        <pre><code class="language-mermaid">
flowchart TD
    Start --> Input["用户在LoginFrame输入\n用户名和密码"];
    Input --> ClickLogin{点击"登录"按钮};
    ClickLogin --> GetData["LoginFrame获取输入数据"];
    GetData --> CallDAO["调用UserDAO.login(user, pass)"];
    CallDAO --> QueryDB["UserDAO查询数据库t_user表"];
    QueryDB --> Validate{数据库验证凭证};
    Validate -- 成功 --> LoadUser["加载用户信息"];
    LoadUser --> ShowMain["创建并显示MainFrame"];
    ShowMain --> CloseLogin["关闭LoginFrame"];
    CloseLogin --> End;
    Validate -- 失败 --> ShowError["弹出'用户名或密码错误'提示框"];
    ShowError --> Input;
    Start --> ClickRegister{点击"注册"按钮?};
    ClickRegister -- 是 --> ShowRegister["显示RegisterFrame"];
    ShowRegister --> End;
    ClickRegister -- 否 --> Input;

</code></pre>

        <p class="figure-description">图 C.2 出行记录录入流程 (Mermaid Flowchart)</p>
        <pre><code class="language-mermaid">
flowchart TD
    Start --> Input["用户在TravelRecordPanel\n填写出行信息"];
    Input --> ClickSave{点击"保存记录"按钮};
    ClickSave --> GetData["Panel获取并校验数据"];
    GetData -- 校验失败 --> ShowError["JOptionPane提示错误"];
    ShowError --> Input;
    GetData -- 校验通过 --> CreateObject["封装TravelRecord对象"];
    CreateObject --> CallDAO["调用TravelRecordDAO.addRecord(record, userId)"];
    subgraph "TravelRecordDAO.addRecord 事务"
        direction LR
        Calc["计算积分和减排量\n(查配置表)"] --> SetData["设置到record对象"];
        SetData --> InsertRecord["执行INSERT t_travel_record"];
        InsertRecord -- 成功 --> UpdateUser["执行UPDATE t_user (积分/减排量)"];
        UpdateUser -- 成功 --> Commit[提交事务];
        InsertRecord -- 失败 --> Rollback[回滚事务];
        UpdateUser -- 失败 --> Rollback;
    end
    CallDAO --> CheckResult{数据库操作成功?};
    CheckResult -- 是 --> ShowSuccess["Panel提示成功信息\n(含积分/减排量)"];
    ShowSuccess --> ClearForm["清空表单"];
    ClearForm --> UpdateUI["通知MainFrame更新显示"];
    UpdateUI --> End;
    CheckResult -- 否 --> ShowFailError["Panel提示保存失败"];
    ShowFailError --> Input;

</code></pre>
    </div>

</body>

</html>